--1.实现继承

ClassContainner = {} --父类、子类容器

function Class(super)
    local class_key = {}  --子类在容器中的key值
    class_key.New = function(self,o)
        local m = o or {}  --子类
        setmetatable(m,{__index = ClassContainner[class_key]})
        return m
    end
    
    local class_value = {}  --子类在容器中的value值（存储 class 中的成员变量、成员方法）
    ClassContainner[class_key] = class_value
    setmetatable(class_key,{
        __newindex = function(t,k,v)
            class_value[k] = v  --add成员变量、成员方法
        end
    })

    if super then  --存在父类
        setmetatable(class_value,{
            __index = function(t,k)
                local super_value = ClassContainner[super][k]  --返回父类的成员变量、成员方法
                class_value[k] = super_value
                return super_value
            end
        })
    end

    return class_key
end

--2.单例模板

Singleton = {}
Singleton.__index = Singleton
function Singleton:New(o)
	m = o or {}
	setmetatable(m,Singleton)
	return m
end
--获取单例实例
function Singleton:GetInstance()
	if not self.instance then
		self.instance = self:New()
	end
	return self.instance
end